package com.fanghaoran.notes.controller;

import com.fanghaoran.notes.util.Constants;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.lang.reflect.Method;

/**
 * @Author: win11
 * @Date: 2023/04/13/14:02
 * @Description: 用于集中处理方法的调用
 */
public class BaseServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //请求路径的格式应该是: /xxx?method=方法名
        // (这里的xxx是对应的controller,BaseServlet只是他们抽取出来的父类,真正执行方法还是在对应的controller)
        //请求路径必须有method这个参数
        //通过反射来执行对应方法,所以method的value必须跟实际方法的方法名保持一致

        //1.获取请求路径中的method对应的value
        String methodStr=request.getParameter(Constants.METHOD);
        //2.利用反射来调用子类的方法(父类对象调用子类方法)
        //a.获取父类的class对象
        Class<? extends BaseServlet> clazz = this.getClass();
        //b.获取子类方法
        try {
            //参数1:要获取的方法(方法名)
            //参数2:方法的参数类(class)
            if(methodStr!=null) {
                Method method = clazz.getMethod(methodStr, HttpServletRequest.class, HttpServletResponse.class);

                //c.执行方法
                //参数1:要执行方法的对象
                //参数2:方法的参数
                //返回值:执行方法的返回值,如果是void,则返回null
                method.invoke(this, request, response);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
